package stores;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Vector;

import com.sun.xml.internal.bind.v2.runtime.reflect.Accessor.GetterOnlyReflection;

import models.Agenda;
import models.Dia_Semana;
import models.Odontologo;
import models.Paciente;
import models.Sistema;
import models.Turno;

public class Dao_Turnos {
	private Dao_connection unicaConeccion = Dao_connection.getInstancia();

	public void inicializarTurnos(Dia_Semana diaActual, String matricula, Agenda a) {
		System.out.println("-------------------------------Turnos ----------------------------");
		Date countDates= a.getFechaDesde();
		
		java.sql.Date sqlFechaHasta= new java.sql.Date(a.getFechaHasta().getTime());
		java.sql.Date sqlFechaDesde= new java.sql.Date(a.getFechaDesde().getTime());
		while ( countDates.before(a.getFechaHasta()) )
		{
			System.out.println("-------------------------------Dia ----------------------------");
			System.out.println("countDates .. "  + countDates );
			System.out.println("a.getFechaHasta() .. "  + a.getFechaHasta() );
			
			Time horaCount = new Time (diaActual.getHorarioInicial().getHours(), diaActual.getHorarioInicial().getMinutes(), 0);
			System.out.println("horaCount .. "  + horaCount );
			System.out.println("horaCount.getHours() "  + horaCount.getHours() );
			while(horaCount.getHours() !=  diaActual.getHorarioFinal().getHours() -1)
			{
				System.out.println("---");
				//insertar un turno con esta hora y la fecha actual
				try{
					
				
					Connection connection = unicaConeccion.getConnection();
					
					String query = "INSERT INTO Turno (fecha,estadocancelado,fecha_Cancelacion,#dni,nombre_dia,hora, fecha_desde,fecha_hasta,#Mat, disponibilidad) VALUES " +
							"(?,?,?,?,?,?,?,?, ?,?)";
					PreparedStatement stmt = connection.prepareStatement(query);		
					java.sql.Date sqlFecha= new java.sql.Date(countDates.getTime()); 
					stmt.setDate(1, sqlFecha);
					stmt.setInt(2, 0);
					stmt.setDate(3,null);
					stmt.setInt(4,00000000);
					stmt.setString(5, diaActual.getNombre());
					stmt.setTime(6, horaCount);
					stmt.setDate(7, sqlFechaDesde);
					stmt.setDate(8, sqlFechaHasta);
					stmt.setString(9, matricula);
					stmt.setInt(10, 1);
					stmt.execute();		
				
				}catch(SQLException e){
					e.printStackTrace();
				}
				catch(Exception e){
					e.printStackTrace();
				}
				horaCount.setHours(horaCount.getHours()+1) ;
				System.out.println("horacount ... " + horaCount);
				
			}
			countDates= fechaMas(countDates, 7);
			System.out.println("countDates + 1 .. "  + countDates );
		}
		
	}
	
	
	public java.util.Date fechaMas(java.util.Date fch, int dias){ 
	     Calendar cal = new GregorianCalendar(); 
	     cal.setTimeInMillis(fch.getTime()); 
	     cal.add(Calendar.DATE, dias); 
	     return new Date(cal.getTimeInMillis()); 
	   }


	public Vector<Turno> getTurnos(java.util.Date fecha,
			Odontologo odontologoActual) {
		Vector<Turno> turnos= new Vector <Turno>();
		try{
			
			java.sql.Date sqlFecha= new java.sql.Date ( fecha.getTime());
			Connection connection = unicaConeccion.getConnection();
			Statement stmt = connection.createStatement();
			String query1 = "SELECT * FROM turno where fecha= '"+ sqlFecha + "' and #mat= '" +odontologoActual.getMatricula() + "' and disponibilidad=1 ";
			
			System.out.println("query ... "+ query1);
		
			ResultSet rs = stmt.executeQuery(query1);
			while(rs.next()){
				Time horaTurno;
				System.out.println("error: "+rs.getString("hora"));
				String hora= rs.getString("hora").substring(0, rs.getString("hora").indexOf(":"));
				System.out.println(hora);
				String minutos= rs.getString("hora").substring(rs.getString("hora").indexOf(":")+1,rs.getString("hora").indexOf(":") + 3);
				System.out.println(minutos);
				horaTurno= new Time(Integer.parseInt(hora), Integer.parseInt(minutos) ,0);
				
				Turno nuevo= new Turno (fecha, horaTurno, null);
				turnos.add(nuevo);
			}
				
		}catch(SQLException e){
			e.printStackTrace();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return turnos;
	}


	public boolean asignarTurno(Turno asignado, Paciente pacienteActual, Odontologo odontologoActual) {
		boolean validar=true;
		try {
			Connection connection = unicaConeccion.getConnection();
			String query1 = "UPDATE  turno set #dni="+ pacienteActual.getDni()+", disponibilidad=0 where" +
			" fecha= '" + new java.sql.Date (asignado.getFecha().getTime())+ "' and hora= '" +asignado.getHora()+ "' and #mat= "+ odontologoActual.getMatricula()  ; 
			System.out.println("levantar turno modificado..." + query1);
			PreparedStatement stmt = connection.prepareStatement(query1);
			System.out.println("ejecuta?" + stmt.execute());
			
			connection.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
			validar= false;
		} catch (Exception e) {
			e.printStackTrace();
			validar=false;
		}
		return validar;

	} 
	 public Vector<Turno> getTurnos(Paciente p) {
		 Vector<Turno> turnos= new Vector <Turno>();
			try{
				
				
				Connection connection = unicaConeccion.getConnection();
				Statement stmt = connection.createStatement();
				String query1 = "SELECT * FROM turno where #dni= " + p.getDni();
				
				System.out.println("query ... "+ query1);
			
				ResultSet rs = stmt.executeQuery(query1);
				while(rs.next()){
					java.util.Date fecha= new java.util.Date ( rs.getDate("fecha").getTime());
					Time horaTurno;
					System.out.println("error: "+rs.getString("hora"));
					String hora= rs.getString("hora").substring(0, rs.getString("hora").indexOf(":"));
					System.out.println(hora);
					String minutos= rs.getString("hora").substring(rs.getString("hora").indexOf(":")+1,rs.getString("hora").indexOf(":") + 3);
					System.out.println(minutos);
					horaTurno= new Time(Integer.parseInt(hora), Integer.parseInt(minutos) ,0);
					
					Turno nuevo= new Turno (fecha, horaTurno, p );
					turnos.add(nuevo);
				}
					
			}catch(SQLException e){
				e.printStackTrace();
			}
			catch(Exception e){
				e.printStackTrace();
			}
			return turnos;

	}


	public boolean cancelarTurno(Turno cancelado, Odontologo odontologoActual,
			Paciente pacienteActual) {
		boolean validar=true;
		try {
			Connection connection = unicaConeccion.getConnection();
			Date actual= new Date();
			java.sql.Date sqlActual= new java.sql.Date(actual.getTime());
			String query1 = "UPDATE  turno set estadoCancelado= 1, disponibilidad=1, #dni=0,  fecha_Cancelacion= '"+ sqlActual+ "' where" +
			" fecha= '" + new java.sql.Date (cancelado.getFecha().getTime())+ "' and hora= '" +cancelado.getHora()+ "' and #mat= "+ odontologoActual.getMatricula()  ; 
			System.out.println("levantar turno modificado..." + query1);
			PreparedStatement stmt = connection.prepareStatement(query1);
			System.out.println("ejecuta?" + stmt.execute());
			
			int cancel= (pacienteActual.getCancelaciones()+1);
			String query2 = "UPDATE  paciente set cancelaciones="+ cancel +" where #dni= " +pacienteActual.getDni();  
			System.out.println("levantar turno modificado..." + query2);
			PreparedStatement stmt2 = connection.prepareStatement(query2);
			System.out.println("ejecuta?" + stmt2.execute());
			
			connection.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
			validar= false;
		} catch (Exception e) {
			e.printStackTrace();
			validar=false;
		}
		return validar;
	}
	


}
